1. 前置知识
阅读本文需要了解Transformer的基本结构和原理
2. KV Cache
如图所示是GPT模型的基本结构。这是一个自回归生成模型,意味着模型会逐token进行生成,生成的token会进一步参与下一步的计算。例如初始prompts是“I love you, do you love”,模型当前步骤生成的token可能是"me",下一步输入的将是“I love you, do you love me”,直到最终输出一个终点标记。
对于KV Cache,我们需要把注意力集中到Self-attention部分(上图最右边),在此部分之前,计算的主要步骤是将自然语言切分为token,对应到词表中的序号,进而进行embedding和位置编码,得到一个向量化的表示(hidden_states)。之后进行Attention的计算。

而关于KV Cache是如何发挥作用的,可以看Transformers KV Caching Explained
我们可以看到,在计算Token4的时候,如果没有缓存的话,我们需要重复前面计算Token1,2,3的过程,时间复杂度是平方的,而有了缓存,只需要关注token4的计算,时间复杂度变成了线性的。

3. Q&A
Q. 为什么token的位置不会是影响因素呢,不是有位置编码吗?
A:在Transformer的原始结构中,使用了绝对位置编码,在自回归的过程中,当前token及当前token之前的token位置都是没有发生变化的,而当前token之后的token,由于使用了因果注意力机制,对于当前token是没有任何影响的。
如果使用其他位置编码方法,例如相对位置编码等,要么会在缓存的KV之后进行另外的动态位置偏置计算(相对位置编码),要么缓存的KV已经包含了位置信息(旋转位置编码)。
Q. 为什么只缓存KV,为什么不缓存Q?
A:从上图可以看到,缓存了KV之后,只需要最后一个query token参与计算,缓存Q是没有意义的。
Q. Prompts中的已知token在推理时是如何处理的?
A:Prompts中的token会在计算时一次性输入到Transformer中进行并行计算,但是这一步中并不输出结果,只取KV Cache。由于使用了因果注意力机制,所以即使当前token后面的token是已知的,当前token也看不到后面的相关信息。
💬 评论讨论